/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package visual.Configuracion;

/**
 *
 * @author giulio
 */
import bentity.beEntrada;
import bentity.beRack;
import bentity.beTipoProducto;
import bentity.beUsuario;
import blogic.blAlmacen;
import blogic.blHelper;
import blogic.blLog;
import blogic.blRack;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferStrategy;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import visual.Seguridad.visualHelper;

	public class dlgMapaSecciones extends javax.swing.JDialog{
	    private static final int TAM_UNIT = 10;
	    private int racksXCol = 0;
	    private int racksXFila = 0;
	    private int tamRack = 0;
            private boolean esPrimeraVez=false;
            private boolean pintaSec=false;
            private boolean clic = false;
            private Point puntoCentrado= new Point();

	    private Point seccion = new Point(-1,-1);
            private ArrayList<Point> secs= new ArrayList<Point>();
	    private ArrayList<Point> racks_escogidos = new ArrayList<Point>();
            private ArrayList<beRack> racks=new ArrayList<beRack>();
	    private char[][] matriz;
            //private boolean eligio_entrada=false;
            private BufferStrategy bfs=null;
            private ArrayList entradas=new ArrayList<beEntrada>();
            private beUsuario usuario;

            public dlgMapaSecciones(pnfDistribucionAlmacen parent, boolean b, beUsuario usu) {
                super((java.awt.Frame)null,b);
                usuario=usu;
                racksXCol=parent.getRaCol();
                racksXFila=parent.getrFila();
                tamRack=parent.getUxr();
                blAlmacen bla= new blAlmacen();
                blHelper blh= new blHelper();
                blRack blr= new blRack();
                try {
                    entradas = bla.buscarObjsEntrada();

                } catch (SQLException ex) {
                    ex.printStackTrace();
                    visualHelper.mostrarMensajeError("Ocurrió un error durante el proceso");
                }
                
                try {
                    racks = blr.obtenerRacksConSecs();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                    visualHelper.mostrarMensajeError("Ocurrió un error durante el proceso");
                }


                initComponents();
                this.setModal(true);
                visualHelper.centrarDialogoEnPantalla(this);
                puntoCentrado=visualHelper.centrarDibujo(this.getSize(), blh.calcularNumeroColumnas(racksXFila, tamRack),blh.calcularNumeroFilas(racksXCol) , TAM_UNIT);
                this.repaint();
                

            }

	    private void initComponents() {
		this.setLayout(null);
		this.setBounds(100, 100, 800, 600);
                JLabel lblTitulo = new javax.swing.JLabel();
                JButton btnGuardarSeccion = new JButton();
                lblTitulo.setFont(new java.awt.Font("Dialog", 0, 36));
                lblTitulo.setText("Selección de zonas");
                add(lblTitulo);
                lblTitulo.setBounds(170, 20, 445, 43);
                btnGuardarSeccion.setBackground(new java.awt.Color(240, 235, 226));
                btnGuardarSeccion.setFont(new java.awt.Font("Dialog", 0, 12));
                btnGuardarSeccion.setForeground(new java.awt.Color(0, 0, 0));
                btnGuardarSeccion.setText("Guardar");
                btnGuardarSeccion.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                btnGuardarSeccionActionPerformed(e);
            }
        });
                btnGuardarSeccion.setSize(120, 27);
                Point pto = visualHelper.cuadrarBotonEsqInfDer(btnGuardarSeccion.getSize().width, this.getSize());
                btnGuardarSeccion.setLocation(pto);
                add(btnGuardarSeccion);
		this.leerArchivo();
                this.setAlwaysOnTop(true);

                addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent evt) {
                        formMouseClicked(evt);
            }
        });
                addMouseMotionListener(new java.awt.event.MouseAdapter() {
                    public void mouseMoved(java.awt.event.MouseEvent evt){
                        formMouseMoved(evt);
                    }
                });

                this.addWindowListener(new WindowListener() {

            public void windowOpened(WindowEvent e) {
                repaint();
            }

            public void windowClosing(WindowEvent e) {

            }

            public void windowClosed(WindowEvent e) {

            }

            public void windowIconified(WindowEvent e) {
            }

            public void windowDeiconified(WindowEvent e) {
            }

            public void windowActivated(WindowEvent e) {
                repaint();
            }

            public void windowDeactivated(WindowEvent e) {
            }
        });

	    }

            public void btnGuardarSeccionActionPerformed(java.awt.event.ActionEvent evt){
                if (!racks_escogidos.isEmpty()){
                    String des=JOptionPane.showInputDialog(null, "Ingrese el nombre de la sección de productos", "Confirmación",JOptionPane.INFORMATION_MESSAGE);
                    if (des!=null && !des.equals("")){
                        beTipoProducto beT=new beTipoProducto();
                        beT.setDescripcion(des);
                        blAlmacen bla = new blAlmacen();
                        try {
                            bla.registraTipoProducto(beT, racks_escogidos);
                            visualHelper.mostrarMensajeSatisfaccion("Se registró la sección con éxito");
                            (new blLog()).registrarLog(this.usuario.getIdUsuario(), this.usuario.getCargo(), "Se registró la sección "+des);
                        } catch (SQLException ex) {
                            ex.printStackTrace();
                            visualHelper.mostrarMensajeError("Ocurrió un error durante el proceso");
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            visualHelper.mostrarMensajeError("Ocurrió un error durante el proceso");
                        }

                        this.dispose();
                    }
                    else{
                        visualHelper.mostrarMensajeAdvertencia("No se ingresó el nombre de la sección");
                    }
                }
                else{
                    visualHelper.mostrarMensajeAdvertencia("Seleccione algún rack para asignarle un tipo de producto");
                }
                
            }

	    private void leerArchivo() {
		try {
		    leeDatos();
		}
		catch (Exception ex) {
		    System.out.println("Ocurrió un error");
		}
	    }

	    private void leeDatos() throws Exception{

		int numCol = (new blHelper().calcularNumeroColumnas(racksXFila, tamRack));
		int numFil = (new blHelper().calcularNumeroFilas(racksXCol));


		matriz =new blHelper().llenarMatrizEntradas(entradas, numCol, numFil, tamRack);
                for (int r=0;r<racks.size();r++){
                    int x=2+((((beRack)racks.get(r)).getNumRack())-1)*(tamRack+1);
                    int y=racks.get(r).getNumFila();
                    if ((y % 2) == 1){
                        y = ((y+1)/2)*3-1;
                    }                        
                    else {
                        y = (y/2)*3;
                    }                    
                    for(int j=1; j<=this.tamRack;j++){
                        matriz[x][y]='S';
                        x++;
                    }
                }
                this.imprimirMatriz();
	    }

            private void imprimirMatriz(){
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksXFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksXCol);

                for(int i=0; i<numFil; i++){
		    for(int j=0; j<numCol; j++)
		        System.out.print(""+matriz[j][i]);
		    System.out.println("");
		}
            }

	    private Point getNuevoPunto(int rInt) {
		int grupoRack = rInt / (tamRack*2);
		int filaRack = grupoRack / racksXFila;
		return null;
	    }

            private void formMouseClicked(java.awt.event.MouseEvent evt) {

                int corX=evt.getX();
                int corY=evt.getY();
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksXFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksXCol);
                

                if(corX>=puntoCentrado.x+TAM_UNIT &&corX<(puntoCentrado.x-TAM_UNIT+(numCol*TAM_UNIT)) && corY>=puntoCentrado.y+TAM_UNIT && corY<puntoCentrado.y-TAM_UNIT+(numFil*TAM_UNIT)){
                    if(matriz[seccion.x][seccion.y]=='*'){
//                        seccion.x=(corX-puntoCentrado.x)/TAM_UNIT;
//                        seccion.y=(corY-puntoCentrado.y)/TAM_UNIT;
                        
                        
                        Point p = new Point();
                        p.x=((seccion.x-1-((seccion.x-1)/(tamRack+1)))/tamRack)+1;
                        p.y=seccion.y-1-((seccion.y-1)/3);                        
                        Point sec = new Point();                        
                        boolean Seleccionado=false;
                        int i=0;
                        while (!Seleccionado && i<secs.size()){
                            if (racks_escogidos.get(i).x==p.x&&racks_escogidos.get(i).y==p.y)
                                Seleccionado=true;
                            i++;
                        }
                        if (!Seleccionado){
                            sec.x=seccion.x;
                            sec.y=seccion.y;
                            racks_escogidos.add(p);
                            secs.add(sec);
                            clic= true;
                            repaint();
                        }


                        
                    }
                    //System.out.println(this.numCol + " "+this.getNumFil()+" "+corX+" "+ corY);
                }
            }

            private void formMouseMoved(java.awt.event.MouseEvent evt) {

                int corX=evt.getX();
                int corY=evt.getY();
                blHelper blh = new blHelper();
                int numCol = blh.calcularNumeroColumnas(racksXFila, tamRack);
		int numFil = blh.calcularNumeroFilas(racksXCol);
                seccion.x=(corX-puntoCentrado.x)/TAM_UNIT;
                seccion.y=(corY-puntoCentrado.y)/TAM_UNIT;

                if(corX>=puntoCentrado.x+TAM_UNIT &&corX<(puntoCentrado.x-TAM_UNIT+(numCol*TAM_UNIT)) && corY>=puntoCentrado.y+TAM_UNIT && corY<puntoCentrado.y-TAM_UNIT+(numFil*TAM_UNIT)){
                    if(matriz[seccion.x][seccion.y]=='*'){
                        pintaSec=true;
                        repaint();
                    }
                }
            }

	    @Override
	    public void paint(Graphics g){
                if (!this.esPrimeraVez){
                    this.esPrimeraVez=true;
                    this.createBufferStrategy(2);
                    bfs =this.getBufferStrategy();
                }

                if (getBfs()!=null){
                    Graphics g1=getBfs().getDrawGraphics();
                    super.paint(g1);
                    visualHelper.pintarAlmacenConEntradasSecciones(g1,entradas, racksXCol, racksXFila, tamRack, TAM_UNIT, racks,this.getSize(),secs, clic);
                    visualHelper.pintarMalla(g1, racksXCol, racksXFila, tamRack, TAM_UNIT,  this.getSize());
                    visualHelper.pintarRotulosPasillosRacksFilas(g1, racksXCol, racksXFila, tamRack, this.TAM_UNIT, this.getSize());
                    if(pintaSec){
                        pintarSeccion(g1);
                    }
                    getBfs().show();
                }

	    }

	    private void pintarAlmacen(Graphics g) {
 		int numCol = this.getNumCol();
		int numFil = this.getNumFil();

		for(int i=0; i<=numFil; i++)
		    for(int j=0; j<=numCol; j++){
		        if (matriz[j][i] == '*'){
		            if ((j==0) || (j==(numCol-1)) || (i==0) || (i==(numFil-1)))
		                g.setColor(Color.DARK_GRAY);
		            else
		                g.setColor(Color.GREEN);
                            g.fillRect(150+j*this.TAM_UNIT, 150+i*this.TAM_UNIT, this.TAM_UNIT, this.TAM_UNIT);

		        }
                        else{
                          if (matriz[j][i] == 'E'){
                                g.setColor(Color.CYAN);
                                g.fillRect(150+j*this.TAM_UNIT, 150+i*this.TAM_UNIT, this.TAM_UNIT, this.TAM_UNIT);
                            }
                          else{
                             if (matriz[j][i] == 'S'){
                                g.setColor(Color.BLUE);
                                g.fillRect(150+j*this.TAM_UNIT, 150+i*this.TAM_UNIT, this.TAM_UNIT, this.TAM_UNIT);
                            }
                          }
                        }
		    }
	    }

            private void pintarSeccion(Graphics g) {
                if(seccion.x!=-1 && seccion.y!=-1){
                    g.setColor(Color.YELLOW);
                    int ini=seccion.x;
                    while (ini>0 && matriz[ini-1][seccion.y] == '*'){
                        ini-=1;
                    }
                    g.fillRect(puntoCentrado.x+ini*this.TAM_UNIT, puntoCentrado.y+seccion.y*this.TAM_UNIT, this.TAM_UNIT*tamRack, this.TAM_UNIT);
                    pintaSec=false;
                }
	    }

	    private int getNumFil(){
		return racksXCol*3+3;
	    }

	    private int getNumCol(){
		return racksXFila*tamRack+racksXFila+3;
	    }

	    private int getNumTotalUbicaciones(){
		return racksXFila*racksXCol*tamRack;
	    }

             public BufferStrategy getBfs() {
        return bfs;
    }

    /**
     * @param bfs the bfs to set
     */
    public void setBfs(BufferStrategy bfs) {
        this.bfs = bfs;
    }
	
}
